﻿#pragma once

#include <QtWidgets/QWidget>
#include "ui_QtWidgetsApplication4.h"
#include <QAudioInput>
#include <QAudioFormat>
#include <QMediaDevices>
#include <QAudioDevice>
#include <QAudioSource>
#include <QIODevice>
#include <QAudioBuffer>  //音频帧
#include <cmath> 

#include <QTimer>
#include <QThread>
#include <QHBoxLayout>
#include <QChart>
#include <QChartView>
#include <QBarSeries>
#include <QBarSet>
#include <QBarCategoryAxis>
#include <QValueAxis>

#include <fftw3.h>   // FFT库

class QtWidgetsApplication4 : public QWidget
{
	Q_OBJECT

public:
	QtWidgetsApplication4(QWidget* parent = nullptr);
	~QtWidgetsApplication4();
	
	QBarSeries* m_series;        // 频谱柱状图数据集
	QChart* m_chart;             // 频谱图表
	QStringList bandCategories;  // 存储20个频段的X轴标签
	QBarCategoryAxis* m_axisX;   // X轴
	QValueAxis* m_axisY;         // Y轴
	QChartView* m_chartView;     // 频谱图表视图
	QBarSet* m_barSet;           // 频谱柱状图
	QString getBandLabel(int);   // 获取20个频段的标签
	void paintEvent_init();      // 初始化图表

public slots:
	void update_chart(QVector<double>); // 更新图表 30ms/次

private:
	Ui::QtWidgetsApplication4Class ui;
};

class AudioQThread : public QObject
{
	Q_OBJECT

public:
	AudioQThread();
	~AudioQThread();
	void work();    // 线程处理函数
	void readAll(); // 读取音频数据

	QIODevice* audioIODevice = nullptr; // 录音源
	QAudioFormat formatAudio; // 音频格式
	void updateFFT();         // 计算FFT，将频域转为分贝 

signals:
	void updatePlot(QVector<double>); // 更新频谱图

private:
	// FFT相关变量
	// FFT核心参数（确保覆盖20kHz：采样率≥44.1kHz，FFT点数≥2048）
	static const int FFT_SIZE = 2048;  // FFT点数（2^11，44.1kHz采样率下频率分辨率≈21.5Hz）
	fftw_complex* fftIn;        // FFT输入（复数数组）
	fftw_complex* fftOut;       // FFT输出（复数数组）
	fftw_plan fftPlan;          // FFT计划
	QVector<double> fftFreqs;   // FFT对应的实际频率（0Hz~奈奎斯特频率）
	QVector<double> fftDb;      // FFT结果（分贝值，对应fftFreqs）

	// 20频段配置（对数刻度，覆盖20Hz-20kHz）
	static const int BAND_COUNT = 20;           // 频段数量
	QVector<QPair<double, double>> bandRanges;  // 每个频段的[起始频率, 结束频率]
	QVector<double> bandEnergy; // 每个频段的平均能量（分贝值）

	// 辅助变量
	QTimer* updateTimer;        // 刷新定时器（30ms/次，≈33fps）
	QVector<qint16> audioBuffer;// 音频缓冲区（存储待FFT的时域数据）
	double nyquistFreq=NULL;    // 奈奎斯特频率（采样率/2，确保≥20kHz）
};
